package com.ruoyi.common.service.impl;



import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.entity.ApiResponse;
import com.ruoyi.common.entity.ProjectItem;
import com.ruoyi.common.entity.dto.CourseItemDTO;
import com.ruoyi.common.entity.dto.ProjectItemPageDto;
import com.ruoyi.common.entity.dto.ProjectItemDto;
import com.ruoyi.common.mapper.ProjectItemMapper;
import com.ruoyi.common.service.ProjectItemService;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 0617
 */
@Service
public class ProjectItemServiceImpl extends ServiceImpl<ProjectItemMapper, ProjectItem> implements ProjectItemService {
    @Override
    public List<CourseItemDTO> findByProjectId(Long id) {
        List<ProjectItem> projectItems = this.baseMapper.selectList(Wrappers.<ProjectItem>lambdaQuery()
                .eq(ProjectItem::getProjectId, id));
        CourseItemDTO courseItemDTO = new CourseItemDTO();
        ArrayList<CourseItemDTO> courseItemDTOS = new ArrayList<>();
        for (ProjectItem projectItem : projectItems) {
            courseItemDTO.setTitle(projectItem.getTitle());
            courseItemDTO.setDescription(projectItem.getDescription());
            courseItemDTO.setIconClass(projectItem.getIconClass());
            List<String> features = JSONUtil.parseArray(projectItem.getFeatures()).toList(String.class);
            courseItemDTO.setFeatures(features);
            courseItemDTOS.add(courseItemDTO);
        }
        return courseItemDTOS;
    }


    @Override
    public ProjectItem selectById(Long id) {

        return this.baseMapper.selectById(id);


    }

    /**
     * 查询项目列表并按日期分组
     */
    @Cacheable(value = "projectItemPageCache", key = "'page:' + #queryDto.pageNum + ':' + #queryDto.pageSize + ':' + #queryDto.categoryId + ':' + #queryDto.title")
    public  Map<String, Object> getAllProjectItems(ProjectItemPageDto queryDto) {
        PageHelper.startPage(queryDto.getPageNum(), queryDto.getPageSize());

        // 查询扁平列表（假设这是你的 Mapper 方法）
        List<ProjectItem> allItems = this.baseMapper.selectList(Wrappers.<ProjectItem>lambdaQuery()
                .eq(ObjectUtil.isNotNull(queryDto.getCategoryId()),ProjectItem::getCategoryId, queryDto.getCategoryId())
                        .eq(ProjectItem::getStatus, 1)
                .like(ObjectUtil.isNotNull(queryDto.getTitle()),ProjectItem::getTitle, queryDto.getTitle())
                .orderByDesc(ProjectItem::getCreateTime).orderByDesc(ProjectItem::getId));

        // 得到 PageInfo（包含 total、页码等）
        PageInfo<ProjectItem> pageInfo = new PageInfo<>(allItems);

        // 1. 将扁平列表按 date 字段分组
        Map<String, List<ProjectItem>> groupedData = pageInfo.getList().stream()
                .collect(Collectors.groupingBy(
                        // 假设 ProjectItem 有 getDate() 返回 "2023-10-15" 格式
                        item -> item.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
                ));

        // 2. 构造返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("code", 200);
        result.put("pageNum", pageInfo.getPageNum());
        result.put("pageSize", pageInfo.getPageSize());
        // 总记录数
        result.put("total", pageInfo.getTotal());
        result.put("data", groupedData);

        return result;
    }

    /*@Override
    public PageInfo<ProjectItem> getAllProjectItems(ProjectItemPageDto queryDto) {
        PageHelper.startPage(queryDto.getPageNum(), queryDto.getPageSize());
        List<ProjectItem> projectItems = this.baseMapper.
                selectList(Wrappers.<ProjectItem>lambdaQuery()
                        .eq(ObjectUtil.isNotEmpty(queryDto.getProjectId()), ProjectItem::getProjectId, queryDto.getProjectId())
                        .like(ObjectUtil.isNotEmpty(queryDto.getTitle()), ProjectItem::getTitle, queryDto.getTitle())

                );

        return new PageInfo<>(projectItems);
    }*/
    // 继承ServiceImpl后，拥有了基本的CRUD能力
    // 可以在这里实现自定义的业务逻辑
}
